package com.founder.devwork.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.founder.devwork.dto.res.TopRepositoryDTO;
import com.founder.devwork.entity.Repository;
import com.founder.devwork.service.RepositoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * RepoController 用于处理与仓库相关的请求。
 * 提供仓库列表、搜索等功能。
 */
@RestController
@RequestMapping("/api/repos")
public class RepoController {

    @Autowired
    private RepositoryService repositoryService;

    /**
     * 获取仓库列表。
     * @param page 页码
     * @param size 每页条数
     * @param gitInstance Git 实例
     * @param name 仓库名称
     * @param sortBy 排序字段
     * @param sortDir 排序方向
     * @return 仓库列表
     */
    @GetMapping("")
    public IPage<TopRepositoryDTO> getRepos(
        @RequestParam(defaultValue = "1") int page,
        @RequestParam(defaultValue = "10") int size,
        @RequestParam(required = false) String gitInstance,
        @RequestParam(required = false) String name,
        @RequestParam(required = false, defaultValue = "totalChanges") String sortBy,
        @RequestParam(required = false, defaultValue = "DESC") String sortDir
    ) {
        return repositoryService.queryRepositoryStats(new Page<TopRepositoryDTO>(page, size), gitInstance, name, sortBy, sortDir);
    }

    /**
     * 搜索仓库。
     * @param name 仓库名称
     * @param page 页码
     * @param size 每页条数
     * @return 仓库列表
     */
    @GetMapping("/search")
    public Page<Repository> search(@RequestParam String name, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) {
        QueryWrapper<Repository> wrapper = new QueryWrapper<>();
        wrapper.like("name", name);
        wrapper.orderByAsc("name");
        return repositoryService.page(new Page<>(page, size), wrapper);
    }
}
